Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / Sideband.git / files / sbapp / services / sidebandservice.py

Displaying Raw • Download


sbapp/services/sidebandservice.py 507eca2e50dfee3826fa3ed595f86cce2e4e009b (507eca2e) Text, 8.57 KB

Tff7b72import T7ee787time
Tff7b72import T7ee787RNS
Tff7b72from T7ee787os Tff7b72import Te6edf3environ

Tff7b72from T7ee787kivyT7ee787.T7ee787logger Tff7b72import Te6edf3LoggerTb4b4b4, Te6edf3LOG_LEVELS
T8b949e# Logger.setLevel(LOG_LEVELS["debug"])
Te6edf3LoggerTff7b72.Td2a8ffsetLevelTb4b4b4(Te6edf3LOG_LEVELSTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4]Tb4b4b4)

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72from T7ee787jnius Tff7b72import Te6edf3autoclassTb4b4b4, Te6edf3cast
Tff7b72from T7ee787android Tff7b72import Te6edf3python_act
Te6edf3Context Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.content.ContextTa5d6ff'Tb4b4b4)
Te6edf3Intent Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.content.IntentTa5d6ff'Tb4b4b4)
Te6edf3BitmapFactory Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.graphics.BitmapFactoryTa5d6ff'Tb4b4b4)
Te6edf3Icon Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.graphics.drawable.IconTa5d6ff"Tb4b4b4)
Te6edf3PendingIntent Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.PendingIntentTa5d6ff'Tb4b4b4)
Te6edf3AndroidString Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffjava.lang.StringTa5d6ff'Tb4b4b4)
Te6edf3NotificationManager Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.NotificationManagerTa5d6ff'Tb4b4b4)
Te6edf3Context Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.content.ContextTa5d6ff'Tb4b4b4)
Te6edf3NotificationBuilder Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.Notification$BuilderTa5d6ff'Tb4b4b4)
Te6edf3NotificationChannel Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.app.NotificationChannelTa5d6ff'Tb4b4b4)
Tff7b72from T7ee787sidebandT7ee787.T7ee787core Tff7b72import Te6edf3SidebandCore

Tff7b72elseTb4b4b4:
Tff7b72from T7ee787sbappT7ee787.T7ee787sidebandT7ee787.T7ee787core Tff7b72import Te6edf3SidebandCore

Tff7b72class T56d364SidebandServiceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffandroid_notificationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3titleTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3contentTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3tickerTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4, Te6edf3groupTff7b72=Tff7b72NoneTb4b4b4, Te6edf3context_idTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3package_name Tff7b72= Ta5d6ff"Ta5d6ffio.unsigned.sidebandTa5d6ff"

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnotification_serviceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnotification_service Tff7b72= Te6edf3castTb4b4b4(Te6edf3NotificationManagerTb4b4b4, Tff7b72selfTff7b72.Td2a8ffapp_contextTff7b72.Td2a8ffgetSystemServiceTb4b4b4(
Te6edf3ContextTff7b72.Td2a8ffNOTIFICATION_SERVICE
Tb4b4b4)Tb4b4b4)

Te6edf3channel_id Tff7b72= Te6edf3package_name
Te6edf3group_id Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3group Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3channel_id Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3groupTb4b4b4)
Te6edf3group_id Tff7b72+Tff7b72= Tffa657strTb4b4b4(Te6edf3groupTb4b4b4)
Tff7b72if Te6edf3context_id Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3channel_id Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3context_idTb4b4b4)
Te6edf3group_id Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3context_idTb4b4b4)

Tff7b72if Tff7b72not Te6edf3title Tff7b72or Te6edf3title Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3channel_name Tff7b72= Ta5d6ff"Ta5d6ffSidebandTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3channel_name Tff7b72= Te6edf3title

Tff7b72selfTff7b72.Td2a8ffnotification_channel Tff7b72= Te6edf3NotificationChannelTb4b4b4(Te6edf3channel_idTb4b4b4, Te6edf3channel_nameTb4b4b4, Te6edf3NotificationManagerTff7b72.Td2a8ffIMPORTANCE_DEFAULTTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_channelTff7b72.Td2a8ffenableVibrationTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_channelTff7b72.Td2a8ffsetShowBadgeTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_serviceTff7b72.Td2a8ffcreateNotificationChannelTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnotification_channelTb4b4b4)

Te6edf3notification Tff7b72= Te6edf3NotificationBuilderTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_contextTb4b4b4, Te6edf3channel_idTb4b4b4)
Te6edf3notificationTff7b72.Td2a8ffsetContentTitleTb4b4b4(Te6edf3titleTb4b4b4)
Te6edf3notificationTff7b72.Td2a8ffsetContentTextTb4b4b4(Te6edf3AndroidStringTb4b4b4(Te6edf3contentTb4b4b4)Tb4b4b4)
T8b949e# if group != None:
T8b949e# notification.setGroup(group_id)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnotification_small_iconTb4b4b4:
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffnotification_icon
Te6edf3bitmap Tff7b72= Te6edf3BitmapFactoryTff7b72.Td2a8ffdecodeFileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_small_icon Tff7b72= Te6edf3IconTff7b72.Td2a8ffcreateWithBitmapTb4b4b4(Te6edf3bitmapTb4b4b4)

Te6edf3notificationTff7b72.Td2a8ffsetSmallIconTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnotification_small_iconTb4b4b4)

T8b949e# large_icon_path = self.sideband.icon
T8b949e# bitmap_icon = BitmapFactory.decodeFile(large_icon_path)
T8b949e# notification.setLargeIcon(bitmap_icon)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnotification_intentTb4b4b4:
Te6edf3notification_intent Tff7b72= Te6edf3IntentTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_contextTb4b4b4, Te6edf3python_actTb4b4b4)
Te6edf3notification_intentTff7b72.Td2a8ffsetFlagsTb4b4b4(Te6edf3IntentTff7b72.Td2a8ffFLAG_ACTIVITY_SINGLE_TOPTb4b4b4)
Te6edf3notification_intentTff7b72.Td2a8ffsetActionTb4b4b4(Te6edf3IntentTff7b72.Td2a8ffACTION_MAINTb4b4b4)
Te6edf3notification_intentTff7b72.Td2a8ffaddCategoryTb4b4b4(Te6edf3IntentTff7b72.Td2a8ffCATEGORY_LAUNCHERTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_intent Tff7b72= Te6edf3PendingIntentTff7b72.Td2a8ffgetActivityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffapp_contextTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3notification_intentTb4b4b4, T79c0ff0Tb4b4b4)

Te6edf3notificationTff7b72.Td2a8ffsetContentIntentTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnotification_intentTb4b4b4)
Te6edf3notificationTff7b72.Td2a8ffsetAutoCancelTb4b4b4(Tff7b72TrueTb4b4b4)

Te6edf3built_notification Tff7b72= Te6edf3notificationTff7b72.Td2a8ffbuildTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotification_serviceTff7b72.Td2a8ffnotifyTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3built_notificationTb4b4b4)

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffargument Tff7b72= Te6edf3environTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffPYTHON_SERVICE_ARGUMENTTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffapp_dir Tff7b72= Tff7b72selfTff7b72.Td2a8ffargument
Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ffandroid_service Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffapp_context Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffwifi_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpower_manager Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffnotification_service Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnotification_channel Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnotification_intent Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnotification_small_icon Tff7b72= Tff7b72None

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffandroid_service Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6fforg.kivy.android.PythonServiceTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffmService
Tff7b72selfTff7b72.Td2a8ffapp_context Tff7b72= Tff7b72selfTff7b72.Td2a8ffandroid_serviceTff7b72.Td2a8ffgetApplicationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffgetApplicationContextTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwifi_manager Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_contextTff7b72.Td2a8ffgetSystemServiceTb4b4b4(Te6edf3ContextTff7b72.Td2a8ffWIFI_SERVICETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpower_manager Tff7b72= Tff7b72selfTff7b72.Td2a8ffapp_contextTff7b72.Td2a8ffgetSystemServiceTb4b4b4(Te6edf3ContextTff7b72.Td2a8ffPOWER_SERVICETb4b4b4)
T8b949e# The returned instance /\ is an android.net.wifi.WifiManager
Tff7b72selfTff7b72.Td2a8ffsideband Tff7b72= Te6edf3SidebandCoreTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3is_serviceTff7b72=Tff7b72TrueTb4b4b4, Te6edf3android_app_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffapp_dirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffservice_context Tff7b72= Tff7b72selfTff7b72.Td2a8ffandroid_service
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffowner_service Tff7b72= Tff7b72self
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffupdate_connectivity_typeTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftake_locksTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False

Tff7b72def Td2a8fftake_locksTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72= Tff7b72selfTff7b72.Td2a8ffwifi_managerTff7b72.Td2a8ffcreateMulticastLockTb4b4b4(Ta5d6ff"Ta5d6ffsideband_serviceTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTaking multicast lockTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffacquireTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72= Tff7b72selfTff7b72.Td2a8ffpower_managerTff7b72.Td2a8ffnewWakeLockTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpower_managerTff7b72.Td2a8ffPARTIAL_WAKE_LOCKTb4b4b4, Ta5d6ff"Ta5d6ffsideband_serviceTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTaking wake lockTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffacquireTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffrelease_locksTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffmulticast_lock Tff7b72== Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleasing multicast lockTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmulticast_lockTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffwake_lock Tff7b72== Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffisHeldTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReleasing wake lockTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwake_lockTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffupdate_connectivity_typeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffreticulumTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Te6edf3is_controlling Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3is_controlling Tff7b72= Tff7b72True

Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetpersistentTb4b4b4(Ta5d6ff"Ta5d6ffservice.is_controlling_connectivityTa5d6ff"Tb4b4b4, Te6edf3is_controllingTb4b4b4)
Tff7b72def Td2a8ffget_connectivity_statusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffreticulumTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff[size=22dp][b]Connectivity Status[/b][/size]Tffea00\nTffea00\nTa5d6ffSideband is connected via a shared Reticulum instance running on this system. Use the rnstatus utility to obtain full connectivity info.Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ws Tff7b72= Ta5d6ff"Ta5d6ffDisabledTa5d6ff"
Te6edf3ts Tff7b72= Ta5d6ff"Ta5d6ffDisabledTa5d6ff"
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffDisabledTa5d6ff"

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_local Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3np Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_localTff7b72.Td2a8ffpeersTb4b4b4)
Tff7b72if Te6edf3np Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3ws Tff7b72= Ta5d6ff"Ta5d6ff1 reachable peerTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ws Tff7b72= Tffa657strTb4b4b4(Te6edf3npTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff reachable peersTa5d6ff"

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcp Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3ts Tff7b72= Ta5d6ff"Ta5d6ffConnected to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8fftarget_ipTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_tcpTff7b72.Td2a8fftarget_portTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3ts Tff7b72= Ta5d6ff"Ta5d6ffInterface DownTa5d6ff"

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2p Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffinterface_i2pTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffConnectedTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3i2s Tff7b72= Ta5d6ff"Ta5d6ffConnecting to I2PTa5d6ff"

Tff7b72return Ta5d6ff"Ta5d6ff[size=22dp][b]Connectivity Status[/b][/size]Tffea00\nTffea00\nTa5d6ff[b]Local[/b]Tffea00\nTffd700{ws}Tffea00\nTffea00\nTa5d6ff[b]TCP[/b]Tffea00\nTffd700{ts}Tffea00\nTffea00\nTa5d6ff[b]I2P[/b]Tffea00\nTffd700{i2s}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3wsTff7b72=Te6edf3wsTb4b4b4, Te6edf3tsTff7b72=Te6edf3tsTb4b4b4, Te6edf3i2sTff7b72=Te6edf3i2sTb4b4b4)

Tff7b72def Td2a8ffrunTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3sleep_time Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffservice.heartbeatTa5d6ff"Tb4b4b4, Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffservice.connectivity_statusTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffget_connectivity_statusTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.service_stopTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Te6edf3sleep_time Tff7b72= T79c0ff0

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.clear_notificationsTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.clear_notificationsTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnotification_service Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnotification_serviceTff7b72.Td2a8ffcancelAllTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffgetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.settings_reloadTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffsetstateTb4b4b4(Ta5d6ff"Ta5d6ffwants.settings_reloadTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsidebandTff7b72.Td2a8ffreload_configurationTb4b4b4(Tb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3sleep_timeTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffrelease_locksTb4b4b4(Tb4b4b4)

Te6edf3SidebandServiceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────